# coding: utf-8
from pycode.account import get_current_user_profile
from django.core.context_processors import csrf
import os, sys
from pycode import settings


from django.template import RequestContext
from django.shortcuts import render_to_response

def stdandart_context(request, *args, **kwargs):
	return {
		"date_format": settings.DATETIME_FORMAT,
		"current_user": get_current_user_profile(),
		"all_langs": settings.LANGS
	}

def render_to(tmpl, no_add_standart_context = False, no_csrf = False):
	def renderer(func):
		def wrapper(request, *args, **kwargs):
			output = func(request, *args, **kwargs)
			if not isinstance(output, dict):
				return output
			if not no_add_standart_context:
				e = stdandart_context(request, *args, **kwargs)
				e.update(output)
				output = e
			if not no_csrf:
				output.update(csrf(request))
			return render_to_response(tmpl, output, context_instance=RequestContext(request))
		return wrapper
	return renderer



class View(object):
	"""
	Базовый класс для класса view-функции
	"""
	def __init__(self, name = "", template = "", url = "", urlpattern = ""):
		# Отображать ли в корневом списке
		self.root_view = False
		# Имя
		self.name = name
		# Шаблон
		self.template = template
		# Ссылка
		self.url = url
		# Паттерн URL
		self.urlpattern = urlpattern
		# Заголовок
		self.title = ""
		# Заголовок на странице
		self.on_page_title = ""
		# Список навигации в админке
		self.navigate_items = []
		# Словарь контекста, который будет добавлен в шаблон после вызова view-функции
		self.add_context = stdandart_context(None)

	def dict_view(self, request, *args, **kwargs):
		"""
		Эту функцию надо перекрыть. Должна вернуть словарь с контекстом для отображения в шаблон
		"""
		return {}
	
	def view(self, request, *args, **kwargs):
		output = self.dict_view(request, *args, **kwargs)
		if isinstance(output, dict):
			if self.add_context:
				output.update(self.add_context)
			if self.title:
				output["title"] = self.title
			if self.on_page_title:
				output["on_page_title"] = self.on_page_title
			else:
				output["on_page_title"] = self.title
			if self.navigate_items:
				output["navigate_items"] = self.navigate_items
			output.update(csrf(request))
			return render_to_response(self.template, output, context_instance=RequestContext(request))
		else:
			return output

def load_views(module_name):
	result = []
	root_path = settings.ROOT_PATH
	for item in os.listdir(root_path):
		if os.path.exists(root_path + "/" + item + "/" + module_name +".py") or os.path.exists(root_path + "/" + item + "/" + module_name +".pyc"):
			mod_name = "pycode." + item + "." + module_name
			__import__(mod_name)
			module = sys.modules[mod_name]
			if hasattr(module, "PUBLIC_VIEWS"):
				result.extend(module.PUBLIC_VIEWS)
	return [klass() for klass in result]
